fix: strip reasoning parts when switching to non-interleaved models #11572
+136
−9
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes cross-model switching errors when moving from a thinking model (e.g., Claude Opus) to a non-thinking model (e.g., GPT 5.2, Claude Sonnet).
reasoningparts from message history at the start ofnormalizeMessages()for models withinterleaved: falsemessages.1.content.0.thinking: each thinking block must contain thinkingFixes #11571
What Changed
packages/opencode/src/provider/transform.ts:normalizeMessages()so it runs before any model-specific early returns (Claude, Mistral, etc.)packages/opencode/test/provider/transform.test.ts:How I Verified It Works
Also ran the full test suite:
bun test test/provider/transform.test.ts→ 97 pass, 0 fail